// 全局变量

package global

import (
	"bufio"
	"encoding/json"
	"fmt"
	"gopatch/file"
	"log"
	"os"
	"strings"
	"sync"
)

// PropertyStruct 基本属性
type PropertyStruct struct {
	BaseProjectPath string `json:"baseProjectPath" name:"项目根路径"`
	TargetPath      string `json:"targetPath" name:"项目编译后需要查找源文件的路径"`
	PatchPath       string `json:"patchPath" name:"补丁路径"`
	PatchName       string `json:"patchName" name:"补丁名称"`
	MinFileLen      int64  `json:"minFileLen" name:"预期最少的文件数"`
}

// 自定义配置信息
var property PropertyStruct

// 不纳入补丁的文件
var neverPatchFiles []string

// 错误信息
var errMsg = msgStruct{
	msgType:    ERROR,
	msgCount:   0,
	msgContent: strings.Builder{},
	msgLock:    sync.Mutex{},
	msgPrefix:  "\u001B[41m######" + "\u001B[0m " + "\u001B[31m",
	msgSuffix:  "\u001B[0m",
}

// 警告信息
var warnMsg = msgStruct{
	msgType:    WARN,
	msgCount:   0,
	msgContent: strings.Builder{},
	msgLock:    sync.Mutex{},
	msgPrefix:  "\u001B[43m######" + "\u001B[0m " + "\u001B[33m",
	msgSuffix:  "\u001B[0m",
}

var allTypeMsg = map[int]*msgStruct{}

// AutoCompare 是否开启自动匹配目录
var AutoCompare bool = false

// SkipConfirm 自动匹配目录时跳过确认环节
var SkipConfirm = false

// VersionFromFile 是否从文件中读取修订号
var VersionFromFile = false

var allFilesMap map[string][]file.FileStruct

func init() {
	allTypeMsg[ERROR] = &errMsg
	allTypeMsg[WARN] = &warnMsg
}

// InitProperty 初始化配置信息
func InitProperty() {
	log.Println("...init Property")
	fileBytes, err := os.ReadFile("./property.json")
	if err != nil {
		panic(fmt.Errorf("读取json配置异常 %v", err))
	}
	err = json.Unmarshal(fileBytes, &property)
	if err != nil {
		panic(fmt.Errorf("json转换异常 %v", err))
	}

	neverPatchFilePath := "./never_patch_file.txt"
	_, err = os.Stat(neverPatchFilePath)
	if !os.IsNotExist(err) {
		// 存在不纳入管理的文件列表，读取每一行作为一个文件，文件路径应该从编译打包后的根目录开始
		log.Println("存在 never_patch_file.txt 文件，开始扫描不纳入管理的文件路径")
		npfile, err := os.Open(neverPatchFilePath)
		if err != nil {
			panic(fmt.Errorf("读取 never_patch_file.txt 文件异常 %v", err))
		}

		defer npfile.Close()

		scanner := bufio.NewScanner(npfile)
		for scanner.Scan() {
			line := scanner.Text()
			if len(strings.TrimSpace(line)) > 0 && string(line[0]) != "#" {
				neverPatchFiles = append(neverPatchFiles, line)
			}
		}

		if err = scanner.Err(); err != nil {
			panic(fmt.Errorf("读取 never_patch_file 文件过程异常 %v", err))
		}
	}
}

// GetProperty 获取配置信息
func GetProperty() PropertyStruct {
	return property
}

// GetNeverPatchFiles 获取不纳入补丁的文件列表
func GetNeverPatchFiles() []string {
	return neverPatchFiles
}

// AppendMsg 根据类型追加信息
func AppendMsg(msgType int, msg string) {
	m := allTypeMsg[msgType]
	if m != nil {
		m.AppendMsg(msg)
	}
}

// GetMsg 根据类型获取信息，不影响原数据
func GetMsg(msgType int) string {
	m := allTypeMsg[msgType]
	if m != nil {
		return m.GetMsg()
	}
	return ""
}

// GetMsgCount 根据类型获取信息条数
func GetMsgCount(msgType int) int {
	m := allTypeMsg[msgType]
	if m != nil {
		return m.msgCount
	}
	return 0
}

// // AppendErrMsg 追加错误信息
// func AppendErrMsg(msg string) {
// 	errMsg.AppendMsg(msg)
// }
//
// // GetErrMsg 获取错误信息，不影响原数据
// func GetErrMsg() string {
// 	return errMsg.GetMsg()
// }
//
// // GetErrorMsgCount 获取错误信息条数
// func GetErrorMsgCount() int {
// 	return errMsg.msgCount
// }
//
// // AppendWarnMsg 追加警告信息
// func AppendWarnMsg(msg string) {
// 	warnMsg.AppendMsg(msg)
// }
//
// // GetWarnMsg 获取警告误信息，不影响原数据
// func GetWarnMsg() string {
// 	return warnMsg.GetMsg()
// }
//
// // GetWarnMsgCount 获取警告信息条数
// func GetWarnMsgCount() int {
// 	return warnMsg.msgCount
// }

func SetAllFilesMap(filesMap map[string][]file.FileStruct) {
	allFilesMap = filesMap
}

func GetSameNameFiles(filenameWithoutExt string) []file.FileStruct {
	if allFilesMap == nil {
		return nil
	}
	return allFilesMap[filenameWithoutExt]
}
